#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
int h[N], sizeh;

void down(int u)
{
    int t = u; // t为记录编号
    if (u * 2 <= sizeh && h[u * 2] < h[t])
        t = u * 2; // 与左儿子比较
    if (u * 2 + 1 <= sizeh && h[u * 2 + 1] < h[t])
        t = u * 2 + 1; // 与右儿子比较
    if (u != t)        // 发生交换
    {
        swap(h[u], h[t]); // 交换元素
        down(t);          // t已经变为儿子，继续向下交换
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &h[i]); // 输入元素到堆
    sizeh = n;              // 堆的大小为n
    for (int i = n / 2; i; i--)
        down(i); // 从底向上排序
    while (m--)
    {
        printf("%d ", h[1]); // 输出栈顶最小数

        // 删除栈顶最小数
        h[1] = h[sizeh];
        sizeh--;
        down(1);
    }
    return 0;
}